package boot

import (
	"fmt"
	"time"
	appData "yunj/app/data"
	"yunj/pkg/global"
	"yunj/pkg/yunj/app/data"
	"yunj/pkg/yunj/app/service/admin/logdbservice"
	"yunj/pkg/yunj/core/redis"
	"yunj/pkg/yunj/util"
)

// 初始化数据准备
func InitDataPrepare() {
	// 加锁
	lock := redis.NewLock("boot:init:data:prepare:lock", 60*time.Second, true)
	defer func() {
		if ok, err := lock.Release(); err != nil {
			global.Logger.Error(util.FormatError(err, "数据准备异常！"))
			panic(fmt.Sprintf("数据准备异常！%v", err))
		} else if !ok {
			panic("数据准备锁释放失败！")
		}
	}()
	if ok, err := lock.Get(); err != nil {
		panic(fmt.Sprintf("数据准备异常！%v", err))
	} else if !ok {
		panic("数据准备正在执行中...")
	}
	// 数据库数据初始化
	// 权限
	if err := data.InitAuthDbData(); err != nil {
		panic(err)
	}
	// 部门
	if err := data.InitDepartmentDbData(); err != nil {
		panic(err)
	}
	// 岗位
	if err := data.InitPostionDbData(); err != nil {
		panic(err)
	}
	// 部门岗位
	if err := data.InitDepartmentPostionDbData(); err != nil {
		panic(err)
	}
	// 角色
	if err := data.InitRoleDbData(); err != nil {
		panic(err)
	}
	// 岗位角色
	if err := data.InitPostionRoleDbData(); err != nil {
		panic(err)
	}
	// 队列
	if err := data.InitQueueDbData(); err != nil {
		panic(err)
	}
	// 定时任务
	if err := data.InitCornDbData(); err != nil {
		panic(err)
	}
	// 任务
	if err := data.InitTaskDbData(); err != nil {
		panic(err)
	}
	// 通知
	if err := data.InitNoticeDbData(); err != nil {
		panic(err)
	}
	// 设置
	if err := data.InitSettingDbData(); err != nil {
		panic(err)
	}
	// 成员
	if err := data.InitMemberDbData(); err != nil {
		panic(err)
	}
	// 成员部门
	if err := data.InitMemberDepartmentDbData(); err != nil {
		panic(err)
	}
	// 成员部门岗位
	if err := data.InitMemberDepartmentPostionDbData(); err != nil {
		panic(err)
	}
	// 成员角色
	if err := data.InitMemberRoleDbData(); err != nil {
		panic(err)
	}
	// 日志表创建
	if err := logdbservice.TablePrepare(); err != nil {
		panic("日志数据表创建异常！" + err.Error())
	}
	// 权限数据准备
	if err := data.AuthPrepareOrReset(); err != nil {
		panic(err)
	}
	// 部门数据准备
	if err := data.DepartmentPrepareOrReset(); err != nil {
		panic(err)
	}
	// 博客数据准备
	if err := appData.InitBlogDbData(); err != nil {
		panic(err)
	}

}
